package jsonTool

import (
	"encoding/json"
	"fmt"
	"log"
)

// JSONToStruct
//
//	@Description: 将JSON转换为结构
//	@param: jsonStr json数据字符串
//	@param: dest 结构体地址
//	@return error
func JSONToStruct(jsonStr string, dest interface{}) error {
	err := json.Unmarshal([]byte(jsonStr), dest)
	if err != nil {
		return fmt.Errorf("failed to unmarshal JSON: %v", err)
	}
	return nil
}

// JsonFormatString
//
//	@Description: 任意类型转换json字符串
//	@param: any1
//	@return string
func JsonFormatString(any1 any) string {
	// 将结构体转换为JSON字符串
	jsonData, err := json.Marshal(any1)
	if err != nil {
		log.Println(fmt.Sprintf("JSON marshaling failed:%s", err))
		return ""
	}
	return string(jsonData)
}

// AddOrUpdateKey
//
// @Description: 添加或更新指定key的值
// @param: jsonData json数据字符串
// @param: key 要添加或更新的key
// @param: value 新的值
// @return string 新的JSON字符串
func AddOrUpdateKey(jsonData string, key string, value interface{}) (string, error) {
	var data map[string]interface{}
	err := json.Unmarshal([]byte(jsonData), &data)
	if err != nil {
		return "", fmt.Errorf("failed to unmarshal JSON: %v", err)
	}

	data[key] = value

	result, err := json.Marshal(data)
	if err != nil {
		return "", fmt.Errorf("failed to marshal JSON: %v", err)
	}

	return string(result), nil
}

// DeleteKey
//
// @Description: 删除指定key
// @param: jsonData json数据字符串
// @param: key 要删除的key
// @return string 新的JSON字符串
func DeleteKey(jsonData string, key string) (string, error) {
	var data map[string]interface{}
	err := json.Unmarshal([]byte(jsonData), &data)
	if err != nil {
		return "", fmt.Errorf("failed to unmarshal JSON: %v", err)
	}

	delete(data, key)

	result, err := json.Marshal(data)
	if err != nil {
		return "", fmt.Errorf("failed to marshal JSON: %v", err)
	}

	return string(result), nil
}

// GetKeyValue
//
// @Description: 查询指定key的值
// @param: jsonData json数据字符串
// @param: key 要查询的key
// @return interface{} 查询到的值
func GetKeyValue(jsonData string, key string) (interface{}, error) {
	var data map[string]interface{}
	err := json.Unmarshal([]byte(jsonData), &data)
	if err != nil {
		return nil, fmt.Errorf("failed to unmarshal JSON: %v", err)
	}

	value, ok := data[key]
	if !ok {
		return nil, fmt.Errorf("key not found: %s", key)
	}

	return value, nil
}
